Linux I/O复用 epoll |
您所在的位置:网站首页 › epoll 头文件 › Linux I/O复用 epoll |
http://www.cnblogs.com/zhangchaoyang/articles/2681893.html
首先看个结构体 typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }struct epoll_event的成员events是个bit set,有几种类型: EPOLLIN:关联的文件是用来读的 EPOLLOUT:关联的文件是用来写的 EPOLLET:Edge Trigger,与之对应的是Level Trigger,下面会详细介绍它们的区别。需要注意的是Level Trigger是默认模式,在我这边(linux-2.6.32)头文件sys/epoll.h中已经没有EPOLLLT的定义了,所以在代码中不要再显式地写EPOLLLT了,反正默认情况用的就是它。select和poll都相当于epoll中的Level Trigger模式。 定义两个变量,后面会用。 struct epoll_event event, events[20];epoll系列有3组函数: int epfd=epoll_create(int size); //创建一个epoll实例。size表示建议内核开辟的空间。int nfds=epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); //准备好读/写的事件存放在参数events中,maxevents是同时监听的最大事件数,timeout是超时返回。int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); //op的取值有:EPOLL_CTL_ADD、EPOLL_CTL_MOD、EPOLL_CTL_DEL,表示你要从监听集中添加、去除或修改某个文件描述符。 看个例子就知道该怎么用了: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 #include #include #include #include #include #include #include #include #include #include #define MAXLINE 5 #define OPEN_MAX 100 #define LISTENQ 20 #define SERV_PORT 5000 #define INFTIM 1000 int main(){ int i,maxi,listenfd,connfd,sockfd,epfd,nfds; int n; int yes=1; char line[MAXLINE+1]; socklen_t clilen; //声明epoll_event结构体变量,ev用于注册事件,数组用于回传要处理的事件 struct epoll_event ev,events[20]; //生成用于处理accept的epoll专用文件描述符 epfd=epoll_create(256); struct sockaddr_in serveraddr; struct sockaddr_in clientaddr; listenfd=socket(PF_INET,SOCK_STREAM,0); //设置套接口选项 setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&yes, sizeof ( int )); //设置与要处理的事件相关的文件描述符 ev.data.fd=listenfd; //设置要处理的事件类型 ev.events=EPOLLET|EPOLLIN; //注册epoll事件 epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev); bzero(&serveraddr, sizeof (serveraddr)); serveraddr.sin_family=AF_INET; char *local_addr= "127.0.0.1" ; inet_pton(AF_INET,local_addr,&(serveraddr.sin_addr)); serveraddr.sin_port=htons(SERV_PORT); bind(listenfd,( struct sockaddr*)&serveraddr, sizeof (serveraddr)); listen(listenfd,LISTENQ); maxi=0; while (1){ //等待epoll事件的发生 nfds=epoll_wait(epfd,events,20,500); //处理所发生的事件 for (i=0;i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |